package cn.edu.swu.ImageDownloader;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;

public class ImageManager {
    // 使用Map存储图片信息（Key: 图片名，Value: 本地路径）
    private Map<String, String> imageMap = new HashMap<>();

    // 下载图片并将信息加入集合，接收Scanner用于输入
    public void downloadImage(String url, Scanner scanner) {
        // 从URL中提取文件名，增强容错性
        String fileName = extractFileName(url);
        // 设置保存路径
        String savePath = "images/" + fileName;

        try {
            // 确保目录存在
            FileUtils.ensureDirectoryExists("images");
            // 下载图片
            FileUtils.saveImage(url, savePath);

            // 处理文件重名情况（如果FileUtils自动重命名了）
            File savedFile = new File(savePath);
            if (!savedFile.exists()) {
                // 查找实际保存的文件名（处理FileUtils自动添加的序号）
                String baseName = fileName.substring(0, fileName.lastIndexOf('.'));
                String ext = fileName.substring(fileName.lastIndexOf('.'));
                for (int i = 1; ; i++) {
                    String possibleName = baseName + "(" + i + ")" + ext;
                    if (new File("images/" + possibleName).exists()) {
                        fileName = possibleName;
                        savePath = "images/" + possibleName;
                        break;
                    }
                }
            }

            // 将图片信息添加到集合
            imageMap.put(fileName, savePath);
            System.out.println("图片下载成功: " + fileName);

            // new: 下载后提示重命名
            System.out.println("提示：建议按分类命名（如'风景_日出.jpg'、'头像_卡通.png'）");
            System.out.print("是否修改文件名？(y/n，默认n)：");
            String renameChoice = scanner.nextLine().trim().toLowerCase();
            if (renameChoice.equals("y")) {
                System.out.print("请输入新文件名（含扩展名）：");
                String newName = scanner.nextLine().trim();
                renameImage(fileName, newName);
            }

        } catch (IOException e) {
            System.out.println("下载失败: " + e.getMessage());
        }
    }

    // new: 提取文件名，增强容错性
    private String extractFileName(String url) {
        // 移除URL参数
        if (url.contains("?")) {
            url = url.substring(0, url.indexOf("?"));
        }
        // 提取最后一个"/"后的内容
        String fileName = url.substring(url.lastIndexOf("/") + 1);
        // 处理没有扩展名或特殊情况
        if (fileName.isEmpty() || !fileName.contains(".")) {
            fileName = "image_" + System.currentTimeMillis() + ".jpg";
        }
        return fileName;
    }

    // 遍历集合，打印已下载图片列表
    public void listImages() {
        if (imageMap.isEmpty()) {
            System.out.println("没有已下载的图片");
            return;
        }

        System.out.println("已下载图片列表:");
        Set<String> fileNames = imageMap.keySet();
        for (String fileName : fileNames) {
            // 显示文件大小
            File file = new File(imageMap.get(fileName));
            String size = file.length() < 1024
                    ? file.length() + "B"
                    : (file.length() / 1024) + "KB";

            System.out.println(fileName + " -> " + imageMap.get(fileName) + " (" + size + ")");
        }
    }

    // 根据名称查找图片路径，返回匹配列表
    public List<String> searchImage(String keyword) {
        List<String> matches = new ArrayList<>();
        // 不区分大小写搜索
        String lowerKeyword = keyword.toLowerCase();

        for (String fileName : imageMap.keySet()) {
            if (fileName.toLowerCase().contains(lowerKeyword)) {
                matches.add(fileName);
            }
        }

        if (matches.isEmpty()) {
            System.out.println("未找到包含 \"" + keyword + "\" 的图片");
        } else {
            System.out.println("找到 " + matches.size() + " 张匹配图片：");
            for (int i = 0; i < matches.size(); i++) {
                String fileName = matches.get(i);
                System.out.println((i+1) + ". " + fileName + " -> " + imageMap.get(fileName));
            }
        }
        return matches;
    }

    // new: 重命名图片（返回是否成功）
    public boolean renameImage(String oldName, String newName) {
        // 校验新文件名合法性
        if (newName == null || newName.trim().isEmpty()) {
            System.out.println("新文件名不能为空");
            return false;
        }
        // 检查是否包含非法字符
        if (newName.contains("/") || newName.contains("\\") || newName.contains(":")) {
            System.out.println("新文件名不能包含 / \\ : 等特殊字符");
            return false;
        }
        if (imageMap.containsKey(newName)) {
            System.out.println("文件名已存在，请换一个");
            return false;
        }

        // 获取原图路径
        String oldPath = imageMap.get(oldName);
        if (oldPath == null) {
            System.out.println("未找到该图片");
            return false;
        }

        // 构建新路径（保持目录不变，只改文件名）
        File oldFile = new File(oldPath);
        String parentDir = oldFile.getParent();
        String newPath = parentDir + File.separator + newName;

        // 执行文件重命名
        if (oldFile.renameTo(new File(newPath))) {
            // 更新映射关系
            imageMap.remove(oldName);
            imageMap.put(newName, newPath);

            // new: 记录重命名日志
            FileUtils.appendRenameLog(oldName, newName, oldPath, newPath);

            System.out.println("重命名成功：" + newName);
            return true;
        } else {
            System.out.println("重命名失败（可能文件被占用或权限不足）");
            return false;
        }
    }

    // new: 获取图片路径
    public String getImagePath(String fileName) {
        return imageMap.get(fileName);
    }

    // 删除图片
    public void deleteImage(String name) {
        String path = imageMap.get(name);
        if (path == null) {
            System.out.println("未找到该图片");
            return;
        }

        File file = new File(path);
        if (file.delete()) {
            imageMap.remove(name);
            System.out.println("图片删除成功：" + name);
        } else {
            System.out.println("图片删除失败（可能文件被占用或权限不足）");
        }
    }
}
